# Integração em Tempo Real (Chart Engine + NestJS WebSocket)

Este plano detalha a implementação da integração real-time entre o `hyperliquid_chart_engine` e o backend em NestJS descrito via WebSocket, com objetivo de assinar canais de candlestick, e injetar esses dados nas sub-engines de renderização do pacote.

## User Review Required

> [!IMPORTANT]
> **Autenticação Automática e URL Base**: A solicitação de manter um autologin será atendida com as credenciais fixadas em variáveis de ambiente simuladas ou injetadas diretamente na classe de inicialização do MarketDataService para demonstração no `example/app`. Assumi a URL base **http://localhost:3000/auth/login** para a chamada RESTful de obtenção do JWT, seguido pela conexão em **ws://localhost:3000/ws**.
> Se houver diferença nas rotas, precisaremos ajustar.

## Proposed Changes

---

### Comunicação Local e Serviços

#### [NEW] [websocket_client.dart](file:///d:/Cloud%20APF/flutter/hyperliquid/plugin-grafico/lib/src/services/websocket_client.dart)
Criaremos um wrapper cliente cross-platform utilizando a biblioteca oficial `web_socket_channel` (já presente em seu `pubspec.yaml`). Ele fornecerá:
- Conexão e emissão do JWT inicial.
- Tratamento de reconexões usando *Exponential Backoff*.
- Stream Controller unificado com *Broadcast* de todas as mensagens vindas.
- Assinatura dinâmica baseada em string (ex: `channel: candle`, `coin: BTC`, `interval: 1m`).

#### [NEW] [market_data_service.dart](file:///d:/Cloud%20APF/flutter/hyperliquid/plugin-grafico/lib/src/services/market_data_service.dart)
Atuará como a Camada de Lógica de Negócios (Business Logic):
- Fará o `http.post` com o usuário `felipe@teste.com` para obter o JWT e passá-lo ao `WebSocketClient`.
- Traduzirá e mapeará os JSONs recebidos de `candle` para as classes core da Chart Engine (`BarPrimitive`).
- Manterá o estado atual das velas operantes. Irá substituir a vela atual se estiver no mesmo período, e adicionar uma nova se for transição temporal, mantendo o histórico consistente.
- Disparará notificações reativas da série temporal completa para a camada superior.

---

### Injeção de Estado (Riverpod)

#### [NEW] [market_data_providers.dart](file:///d:/Cloud%20APF/flutter/hyperliquid/plugin-grafico/lib/src/presentation/providers/market_data_providers.dart)
Proverá todos os stubs estaduais (State Providers e Notifiers) para desacoplar a interface da lógica:
- `marketDataServiceProvider`: a instância do serviço.
- `barsProvider`: O estado vitalício das barras sendo observadas. Notifica sempre que há uma mutação gerada pelo WS para causar resync the paints.
- `selectedCoinProvider` e `chartIntervalProvider`: armazenam o form de configuração para subscription emit.
- `connectionStatusProvider` (Enum: `connected, disconnected, connecting`).

#### [MODIFY] [presentation.dart](file:///d:/Cloud%20APF/flutter/hyperliquid/plugin-grafico/lib/src/presentation/presentation.dart)
Atualizará o export (barrel) para exibir os provedores ao pacote publicamente.

---

### Demonstração & App Test

#### [NEW] [main_live.dart](file:///d:/Cloud%20APF/flutter/hyperliquid/plugin-grafico/example/lib/main_live.dart)
Um exemplo paralelo auto-contido demonstrando como inicializar e plugar a engine em tempo real ao framework completo.
- Irá criar o `ChartWidget` lendo reativamente o `barsProvider`.
- Sem telas de loading / login extras na interface: o auto-login invisível vai inicializar por padrão os gráficos em `BTC`, intervalo `1m` e despejar no Chart.

## Open Questions

1. O endpoint de REST login no seu backend NestJS local está disponível em `http://localhost:3000/auth/login` e espera um *body* em JSON com `{ "email": "...", "password": "..."}` respondendo com um JSON `{ "access_token": "JWT..." }`? Se a resposta for diferente (ex: `"token": "..."`), por favor me avise para configurar certinho.

2. A propriedade `time` via websockets retorna epoch datetime em Millisegundos correto? Ex: `1712345600000`

## Verification Plan

### Automated Tests
- Testar (em Mock) que dados via Event Stream atualizam ou inserem as barras corretas no `BarPrimitive` internal caching system.
- Testar que a classe `MarketDataService` expõe as classes e emite as notificações corretamente via Riverpod Unit Testing.

### Manual Verification
- O usuário deve testar abrindo o `example` compilado (usando o `main_live.dart`) e observar se o login não interativo tem sucesso, renderizando o `ChartWidget` atrelado aos *ticks* do NestJS local!
